import axios from 'axios'
import store from '../store'
import router from '@/router/index.js'
const request = axios.create({
  baseURL: 'http://geek.itheima.net/v1_0/'
})
// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么 ===>设置请求头
  // console.log('拦截器config参数', config)
  if (store.state.user.token && config.url !== 'authorizations') {
    config.headers.Authorization = `Bearer ${store.state.user.token}` // 请求头设置token
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么 ===>简化
  const _data = {
    status: response.status,
    data: response.data.data
  }
  return _data
}, async function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  // 拦截器捕获的到的错误
  // 设置 无token跳转登录地址
  console.log('currentRoute', router.currentRoute)
  const loginPath = `/login?redirect=${router.currentRoute.path}`
  try { // try和catch 是两个独立的作用域!
    // 处理401的情况(用户未认证): 是否需要更新token
    if (error.response && error.response.status === 401) {
      // console.log('出现401情况: 用户认证失败===>是否需要更新token')
      // 1.没有token代表还没有登陆 ===>跳转到登录页面
      const { user } = store.state
      if (!user.token || !user.refresh_token) { // 判断有无token
        // 无token跳转页面(到上次访问的页面的地址)
        router.replace(loginPath) // 跳转登录页不需要上次访问记录
        // 中断请求(就是用户端不再接受到响应,如果不返回错误就会让客服端接受到错误响应体),并抛出错误
        return Promise.reject(error)
      }

      // 2.已经登录===>但token过期,refresh_token没有过期===>重新发请求更新过期的token===>再重新发送上次的401请求
      const { data } = await request({
        method: 'PUT',
        url: 'authorizations',
        headers: {
          Authorization: `Bearer ${user.refresh_token}`
        }
      })
      console.log('用refr_token重新请求登录的参数', data)
      // 把新token存到vuex中的user中 ===>调用mutations的setToken方法
      store.commit('setToken', {
        token: data.token, // 把新的token存放进来
        refresh_token: user.refresh_token
      })
      // 重新发送401的请求  error.config===>有上次401的请求信息 直接当做aixos的请求参数===>就会再次发送请求===>记得返回===>无缝对接(默默的更新了token并且成功发送了请求)
      return request(error.config)
    }
  } catch (error) {
    // 在try里面发现重新通过refresh_token(已经过期了)发送的请求也失败===>捕捉到错误就===>执行直接登录页面
    //  3.token过期了且refresh_token也过期了===>跳转到登录页面(带上次访问的页面地址)
    router.replace(loginPath)
    // 中断请求,并抛出错误
    return Promise.reject(error)
  }
  return Promise.reject(error.response.data)
})
export default request
